home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
-
- #include "DeskLib:WimpSWIs.h"
-
- #include "Shell.Extra.h"
- #include "Shell.BarGraph.h"
- #include "Shell.SafeAlloc.h"
-
-
-
- typedef struct {
- int spacing;
- int barwidth;
- int height;
- double *data;
- int numbars;
- int forecol, backcol;
- double min, max;
- double scale;
- int zeroheight;
- struct {
- unsigned int autoscale : 1;
- }
- flags
- ;
- }
- Shell_dbarinfo2;
-
-
-
-
- #define Shell_RecalculateBar( barinfo) { \
- (barinfo)->scale = (barinfo)->height / ((barinfo)->max - (barinfo)->min); \
- (barinfo)->zeroheight = (int) (- (barinfo)->min * (barinfo)->scale); \
- } \
-
- /*
- #define MAX( a, b) ((a) > (b)) ? (a) : (b)
- #define MIN( a, b) ((a) < (b)) ? (a) : (b)
- */
- /* These are defined in DeskLib:Core.h */
-
-
-
-
-
-
-
- static void Shell_DoubleBarRedrawer2(
- Shell_convertpoint convert,
- wimp_point rectsize,
- void *reference,
- const wimp_rect *redrawrect
- )
-
- { Shell_dbarinfo2 *barinfo = (Shell_dbarinfo2 *) reference;
- int imin, imax, i;
-
- imin = MAX( redrawrect->min.x / barinfo->spacing, 0);
- imax = MIN( redrawrect->max.x / barinfo->spacing + 1, barinfo->numbars);
-
- if ( barinfo->flags.autoscale) {
- double min = barinfo->min, max = barinfo->max;
- for ( i=imin; i<imax; i++) {
- Shell_MakeGE( max, barinfo->data[i]);
- Shell_MakeLE( min, barinfo->data[i]);
- }
- if ( max != barinfo->max || min != barinfo->min) {
- barinfo->min = min;
- barinfo->max = max;
- Shell_RecalculateBar( barinfo)
- }
- }
-
-
-
- for ( i=imin; i<imax; i++) {
-
- int y = (int) ( barinfo->data[i] * barinfo->scale + barinfo->zeroheight);
- int x = i*barinfo->spacing;
- int ymin, ymax;
-
- if ( y < barinfo->zeroheight) {
- ymin = y;
- ymax = barinfo->zeroheight;
- }
-
- else {
- ymin = barinfo->zeroheight;
- ymax = y;
- }
-
- Wimp_SetColour( barinfo->forecol);
- Shell_RectangleFill2( x, ymin, x + barinfo->barwidth, ymax, convert);
-
-
- Wimp_SetColour( barinfo->backcol);
- Shell_RectangleFill2( x, 0, x + barinfo->barwidth, ymin, convert);
- Shell_RectangleFill2( x, ymax, x + barinfo->barwidth, rectsize.y, convert);
-
- }
-
-
- return;
- }
-
-
-
-
- Shell_rectblock *Shell_AddDoubleBarGraph2(
- Shell_windblock *wind,
- int x, int y,
- int numbars, int spacing, int barwidth, int maxheight,
- double *data,
- double min,
- double max,
- BOOL autoscale,
- int forecol, int backcol
- )
- {
-
- Shell_dbarinfo2 *barinfo = (Shell_dbarinfo2 *) Shell_SafeMalloc( sizeof( Shell_dbarinfo2));
- Shell_rectblock *rect;
-
- barinfo->spacing = spacing;
- barinfo->barwidth = barwidth;
- barinfo->data = data;
- barinfo->numbars = numbars;
- barinfo->min = min;
- barinfo->max = max;
- barinfo->flags.autoscale = autoscale;
- barinfo->forecol = forecol;
- barinfo->backcol = backcol;
- barinfo->height = maxheight;
-
- Shell_RecalculateBar( barinfo)
-
- rect = Shell_AddRectangle3( wind, x, y, spacing*numbars, maxheight, Shell_DoubleBarRedrawer2, barinfo);
- Shell_MakeRectIcon( rect, forecol, backcol, "r2");
- return rect;
- }
-
-
-
-